Spring Boot支持集成一个称为'CRaSH'的Java shell,你可以在CRaSH中使用ssh或telnet命令连接到运行的应用,项目中添加以下依赖可以启用远程shell支持:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>
注 如果想使用telnet访问,你还需添加对org.crsh:crsh.shell.telnet
的依赖。
注 CRaSH运行时需要JDK,因为它要动态编译命令。如果一个基本的help
命令都运行失败,你很可能使用的是JRE。
远程shell默认监听端口为2000
,默认用户名为user
,密码为随机生成的,并且在输出日志中会显示。如果应用使用Spring Security,该shell默认使用相同的配置。如果不是,将使用一个简单的认证策略,你可能会看到类似这样的信息:
Using default password for shell access: ec03e16c-4cf4-49ee-b745-7c8255c1dd7e
Linux和OSX用户可以使用ssh
连接远程shell,Windows用户可以下载并安装PuTTY。
$ ssh -p 2000 user@localhost
user@localhost's password:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.4.1.RELEASE) on myhost
输入help
可以获取命令列表,Spring Boot提供metrics
,beans
,autoconfig
和endpoint
命令。
你可以使用management.shell.auth.simple.user.name
和management.shell.auth.simple.user.password
属性配置自定义的连接证书,也可以使用Spring Security的AuthenticationManager
处理登录职责,具体参考CrshAutoConfiguration和ShellProperties的Javadoc。
有很多有趣的方式可以用来扩展远程shell。
你可以使用Groovy或Java编写其他的shell命令(具体参考CRaSH文档),Spring Boot默认会搜索以下路径的命令:
classpath*:/commands/**
classpath*:/crash/commands/**
注 设置shell.command-path-patterns
属性可以改变搜索路径。
注 如果使用可执行存档(archive),shell依赖的所有类都必须打包进一个内嵌的jar,而不是直接打包进可执行jar或war。
下面是一个从src/main/resources/commands/hello.groovy
加载的'hello'命令:
package commands
import org.crsh.cli.Usage
import org.crsh.cli.Command
class hello {
@Usage("Say Hello")
@Command
def main(InvocationContext context) {
return "Hello"
}
}
Spring Boot为InvocationContext
添加一些其他属性,你可以在命令中访问它们:
属性名称 | 描述 |
---|---|
spring.boot.version |
Spring Boot的版本 |
spring.version |
Spring核心框架的版本 |
spring.beanfactory |
获取Spring的BeanFactory |
spring.environment |
获取Spring的Environment |
除了创建新命令,你也可以扩展CRaSH shell的其他特性,所有继承org.crsh.plugin.CRaSHPlugin
的Spring Beans将自动注册到shell,具体查看CRaSH参考文档。